package leetcode_301To600;

/**
 * 本代码来自 Cspiration，由 @Cspiration 提供
 * 题目来源：http://leetcode.com
 * - Cspiration 致力于在 CS 领域内帮助中国人找到工作，让更多海外国人受益
 * - 现有课程：Leetcode Java 版本视频讲解（1-900题）（上）（中）（下）三部
 * - 算法基础知识（上）（下）两部；题型技巧讲解（上）（下）两部
 * - 节省刷题时间，效率提高2-3倍，初学者轻松一天10题，入门者轻松一天20题
 * - 讲师：Edward Shi
 * - 官方网站：https://cspiration.com
 * - 版权所有，转发请注明出处
 */
public class _538_ConvertBSTtoGreaterTree {


    /**
     * Given a Binary Search Tree (BST), convert it to a Greater Tree such that
     * every key of the original BST is changed to the original key plus sum of all keys
     * greater than the original key in BST.

     Example:

     Input: The root of a Binary Search Tree like this:
         5
       /   \
     2     13

     Output: The root of a Greater Tree like this:
         18
       /   \
     20     13

     time : O(n)
     space : O(h)

     * @param root
     * @return
     */

    private int sum = 0;

    public TreeNode convertBST(TreeNode root) {
        if (root == null) {
            return null;
        }
        convertBST(root.right);
        sum += root.val;
        root.val = sum;
        convertBST(root.left);
        return root;
    }
}
